home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
cdplay
/
src
/
key.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
40KB
|
1,315 lines
/* << High C V1.4 & 386ASM V2.0 >> ********************************************
**
** CD PLAYER キーボード インターフェース ルーチン
**
** 1991.03.22 : CREATE
** 1991.03.23 : FINISH
**
** < HISTORY >
** 1991.03.22 : CREATE
**
** < note > : TABS = 4
**
** All Rights Reserved, Copyright (C) Y.Hirata 1991.
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
#include <fmc.h>
#include "key.h"
#include "elevol.h"
#include "sndplay.h"
#include "cdpn.h"
#include "tape.h"
/*-----------------------------------------------------------------------------
** キーリピート制御(待ち時間)に使用します.
-----------------------------------------------------------------------------*/
extern SOFT_timer( unsigned ) ;
/*-----------------------------------------------------------------------------
** いわゆる隠し機能に相当します♪
-----------------------------------------------------------------------------*/
extern char CDDA_FLG_stop ; /* プログラム終了時にSTOPする? */
/*-----------------------------------------------------------------------------
** 停止中/NOT READY中の未アクセスチェックに使用します.
-----------------------------------------------------------------------------*/
extern char Noaflg ; /* 停止中にアクセスしたか? */
/******************************** キー ON チェック *******************************/
int KEY_test( char *matrix,char keyadrs )
/*=============================================================================
** キーマトリクス中で、指定されたキーアドレスのキーが押されているかどうかチェックする.
**
** < INPUT > : キーマトリクス情報 , キーアドレス
** < OUTPUT > : なし
** < RETURN > : キーON ならば 真値 , キーOFF ならば 偽値.
=============================================================================*/
{
unsigned char testbit ;
int c ;
int byteoff ;
testbit = 0x01 ;
for ( c=0; c<(keyadrs%8); c++ ) testbit <<= 1 ;
byteoff = keyadrs / 8 ;
if ( (matrix[byteoff] & testbit) == testbit ) return( TRUE ) ;
return( FALSE ) ;
}
/****************************** キーBREAK 待ち *******************************/
void KEY_break( char keyadrs )
/*=============================================================================
** 指定されたキーアドレスのキーが放されるまで待つ.
**
** < INPUT > : キーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
char matrix[16] ;
do {
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,keyadrs ) ) ;
}
/******************************* キー押下チェック ********************************/
int KEY_hitchk( void )
/*=============================================================================
** キーボードが押されたかどうかチェックする.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : キー入力ありならば 真値 , なしならば 偽値.
=============================================================================*/
{
char matrix[16] ;
char keyon ;
int c ;
KYB_matrix( matrix ) ;
keyon = FALSE ;
for ( c=0; c<16; c++ ) {
if ( matrix[c] ) {
keyon = TRUE ;
break ;
}
}
return( keyon ) ;
}
/**************************** キー押下チェック(マトリクス) ****************************/
int KEY_matrix_check( char *matrix )
/*=============================================================================
** キーボードが押されたかどうかチェックする.
**
** < INPUT > : キーマトリクス情報
** < OUTPUT > : なし
** < RETURN > : キー入力ありならば 真値 , なしならば 偽値.
=============================================================================*/
{
char keyon ;
int c ;
keyon = FALSE ;
for ( c=0; c<16; c++ ) {
if ( matrix[c] ) {
keyon = TRUE ;
break ;
}
}
return( keyon ) ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectexit( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (終了処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event> の EXIT と同じ処理であること.
=============================================================================*/
{
int evno ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
evno = SW_EXIT + SWVAL ;
dispevent( evno,TRUE ) ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_Q :
case KEY_E :
CDDA_FLG_stop = FALSE ;
break ;
case KEY_BREAK :
CDDA_FLG_stop = TRUE ;
}
SNDPLAY_play( EXIT_CH,EXIT_SND ) ;
/* ●● EJECT SWITCH ON ●● */
CDDA_switch( CDDA_SW_EXIT ) ;
dispevent( evno,FALSE ) ;
mossetpos( evno ) ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectstop( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (停止処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectstop> の STOP/PAUSE と同じ処理であること.
=============================================================================*/
{
int evno ;
int c ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_ESC :
evno = SW_STOP + SWVAL ;
break ;
case KEY_SPACE :
case TKEY_EQU :
evno = SW_PAUSE + SWVAL ;
}
dispevent( evno,TRUE ) ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_ESC :
/*-----------------------------------------------------------------------------
** ●●● STOP ●●●
-----------------------------------------------------------------------------*/
Flg.pause = FALSE ;
Flg.shuffle = FALSE ;
Flg.program = FALSE ;
/*-----------------------------------------------------------------------------
** プログラムモード時に停止中ならばプログラム設定曲をクリアする。
-----------------------------------------------------------------------------*/
if ( Playmode == SW_PROGRAM && CDDA_NOW_status == CDDA_STAT_STOP ) {
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = ZERO ;
Prgcnt[c] = ZERO ;
}
Flg.tape = FALSE ;
disptocmode( SW_PROGRAM,DUMMY ) ;
disptime( ZERO,TM_NODISP ) ;
/* ●● STOP SWITCH ON ●● */
CDDA_switch( CDDA_SW_STOP ) ;
dispmsgclear() ;
dispprogramtime() ;
}
if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
CDDA_NOW_status == CDDA_STAT_PAUSE ) {
/* ●● STOP SWITCH ON ●● */
CDDA_switch( CDDA_SW_STOP ) ;
}
dispshuffle( FALSE ) ;
disppause( FALSE ) ;
dispplay( FALSE ) ;
dispevent( evno,FALSE ) ;
mossetpos( SW_STOP+SWVAL ) ;
break ;
case KEY_SPACE :
case TKEY_EQU :
/*-----------------------------------------------------------------------------
** ●●● PAUSE ●●●
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
dispevent( evno,FALSE ) ;
break ;
}
if ( Playmode == SW_PROGRAM && CDDA_TOTAL_program == ZERO ) {
dispevent( evno,FALSE ) ;
break ;
}
if ( Flg.pause ) {
Flg.pause = FALSE ;
} else {
Flg.pause = TRUE ;
dispplay( TRUE ) ;
}
disppause( Flg.pause ) ;
/* ●● PAUSE SWITCH ON/OFF ●● */
CDDA_switch( CDDA_SW_PAUSE ) ;
mossetpos( SW_PAUSE+SWVAL ) ;
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectmode( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (モード選択処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event> の PROGRAM/SINGLE/CONTINUE / REPEAT / TIME と同じ処理
** であること.
=============================================================================*/
{
int evno ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_P :
evno = SW_PROGRAM + SWVAL ;
break ;
case KEY_S :
evno = SW_SINGLE + SWVAL ;
break ;
case KEY_C :
evno = SW_CONTINUE + SWVAL ;
break ;
case KEY_R :
evno = SW_REPEAT + SWVAL ;
break ;
case KEY_T :
evno = SW_TIME + SWVAL ;
}
dispevent( evno,TRUE ) ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_P :
case KEY_S :
case KEY_C :
/*-----------------------------------------------------------------------------
** ●●● 演奏モード ●●●
-----------------------------------------------------------------------------*/
selectmode( evno-SWVAL ) ;
mossetpos( evno ) ;
break ;
case KEY_R :
/*-----------------------------------------------------------------------------
** ●●● REPEAT ●●●
-----------------------------------------------------------------------------*/
if ( Flg.repeat ) {
Flg.repeat = FALSE ;
} else {
Flg.repeat = TRUE ;
}
/* ●● REPEAT SWITCH ON/OFF ●● */
CDDA_switch( CDDA_SW_REPEAT ) ;
disprepeat( Flg.repeat ) ;
mossetpos( SW_REPEAT+SWVAL ) ;
break ;
case KEY_T :
/*-----------------------------------------------------------------------------
** ●●● TIME ●●●
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
CDDA_NOW_status != CDDA_STAT_PAUSE ) break ;
switch ( Timemode ) {
case TM_TR_CLOCK :
Timemode = TM_TR_TIME ;
break ;
case TM_TR_TIME :
Timemode = TM_DISC_CLOCK ;
break ;
case TM_DISC_CLOCK :
Timemode = TM_DISC_TIME ;
break ;
case TM_DISC_TIME :
Timemode = TM_TR_CLOCK ;
break ;
default :
Timemode = TM_TR_CLOCK ;
}
/*-----------------------------------------------------------------------------
** Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
-----------------------------------------------------------------------------*/
Flg.prgchk = FALSE ;
Tcount2 = PRG_WAIT + 1 ;
disptime( CDDA_NOW_musicno,Timemode ) ;
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectonmusic( int no )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (演奏曲指定処理)
**
** < INPUT > : 曲番号
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectmusic> と同じ処理であること.
=============================================================================*/
{
int ret ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
if ( Playmode == SW_PROGRAM ) {
/* ●● 曲番号 ON ●● */
ret = CDDA_switch( no ) ;
if ( !ret ) {
/*-----------------------------------------------------------------------------
** プログラム曲の登録時には、時間表示は、TM_TR_CLOCK とする.
** また、CHECK時同様プログラム曲確認中表示である旨を フラグセット する.
** 曲の登録作業は、checkmusic() で行う.
-----------------------------------------------------------------------------*/
Timemode = TM_TR_CLOCK ;
Flg.prgchk = TRUE ;
checkmusic( no ) ;
disptime( no,Timemode ) ;
TAPE_check() ;
dispprogramtime() ;
}
} else {
disptime( ZERO,TM_NODISP ) ;
checkmusic( no ) ;
/* ●● 曲番号 ON ●● */
if ( !CDDA_switch( no ) ) {
dispplay( TRUE ) ;
Flg.playon = TRUE ;
if ( Flg.shuffle ) {
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
disptocmode( SW_CONTINUE,no ) ;
}
} else {
/*-----------------------------------------------------------------------------
** 指定された曲が演奏できなかった時には、PLAYボタンを OFF表示する.
-----------------------------------------------------------------------------*/
switch ( CDDA_NOW_status ) {
case CDDA_STAT_PLAY :
case CDDA_STAT_PAUSE :
break ;
default :
dispplay( FALSE ) ;
dispmusicno( no,FALSE ) ;
}
}
disptime( no,Timemode ) ;
/*-----------------------------------------------------------------------------
** PAUSE中に曲番号が指定された時には、マウス を PLAYボタンに移動しておく.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {
mossetpos( SW_PLAY+SWVAL ) ;
}
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectplay( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (演奏開始処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectplay>と同じ処理であること.
=============================================================================*/
{
int evno ;
int no ;
int c ;
char flg ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_CR :
case TKEY_CR :
/*-----------------------------------------------------------------------------
** ●●● 曲番号指定 / PLAY ●●●
-----------------------------------------------------------------------------*/
if ( XORno ) {
KEY_selectonmusic( XORno ) ;
return ;
}
case KEY_EXEC :
evno = SW_PLAY + SWVAL ;
break ;
case KEY_S :
evno = SW_SHUFFLE + SWVAL ;
}
dispevent( evno,TRUE ) ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_CR :
case KEY_EXEC :
case TKEY_CR :
/*-----------------------------------------------------------------------------
** ●●● PLAY ●●●
-----------------------------------------------------------------------------*/
mossetpos( SW_PLAY+SWVAL ) ;
for ( flg=FALSE,c=0; c<CDDA_INFO_buf.end; c++ ) {
if ( Prginf[c] ) {
flg = TRUE ;
break ;
}
}
if ( Playmode == SW_PROGRAM && !flg ) {
/*-----------------------------------------------------------------------------
** プログラムモードなのに一曲も指定されていない時には、CONTINUEモードに移行して演奏
** する.
-----------------------------------------------------------------------------*/
selectmode( SW_CONTINUE ) ;
/* ●● PLAY SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PLAY ) ;
if ( no ) dispplay( FALSE ) ;
} else {
/* ●● PLAY SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PLAY ) ;
disperrormsg( no ) ;
if ( !no ) {
/* 演奏 OK! */
if ( !Flg.pause ) Flg.playon = TRUE ;
switch ( Playmode ) {
case SW_PROGRAM :
Flg.program = TRUE ;
disptocmode( SW_PROGRAM,DUMMY ) ;
break ;
case SW_CONTINUE :
if ( Flg.shuffle && !Flg.pause ) {
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
disptocmode( SW_CONTINUE,CDDA_NOW_musicno ) ;
}
break ;
case SW_SINGLE :
checkmusic( CDDA_NOW_start ) ;
}
} else {
/* 演奏 NG! */
if ( CDDA_NOW_status != CDDA_STAT_PLAY ) {
dispplay( FALSE ) ;
}
}
}
disptime( CDDA_NOW_start,Timemode ) ;
Flg.pause = FALSE ;
break ;
case KEY_S :
/*-----------------------------------------------------------------------------
** ●●● SHUFFLE ●●●
-----------------------------------------------------------------------------*/
Flg.shuffle = FALSE ;
/*-----------------------------------------------------------------------------
** シャッフル指定時は、CONTINUEモードと同じ表示とする。
-----------------------------------------------------------------------------*/
disptoc( FALSE ) ;
selectmode( SW_CONTINUE ) ;
mossetpos( SW_SHUFFLE+SWVAL ) ;
/* ●● SHUFFLE SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_SHUFFLE ) ;
if ( !no ) {
/* 演奏 OK! */
Flg.playon = TRUE ;
Flg.shuffle = TRUE ;
dispshuffle( TRUE ) ;
dispplay( TRUE ) ;
checkmusic( CDDA_NOW_start ) ;
disptime( CDDA_NOW_start,Timemode ) ;
} else {
/* 演奏 NG! */
dispshuffle( FALSE ) ;
dispplay( FALSE ) ;
disptoc( FALSE ) ;
disptime( ZERO,TM_NODISP ) ;
}
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectffrew( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (FF/REW 処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectffrew>と同じ処理であること.
=============================================================================*/
{
int evno ;
int no ;
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_BEFORE :
evno = SW_REWMUSIC + SWVAL ;
break ;
case KEY_NEXT :
evno = SW_FFMUSIC + SWVAL ;
break ;
case KEY_F :
evno = SW_FFTIME + SWVAL ;
break ;
case KEY_R :
evno = SW_REWTIME + SWVAL ;
}
dispevent( evno,TRUE ) ;
mossetpos( evno ) ;
/*-----------------------------------------------------------------------------
** Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
-----------------------------------------------------------------------------*/
Flg.prgchk = FALSE ;
Tcount2 = PRG_WAIT + 1 ;
/*-----------------------------------------------------------------------------
** 演奏中かPAUSE中でなければ、スイッチをOFFにして リターン する.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
CDDA_NOW_status != CDDA_STAT_PAUSE ) {
dispevent( evno,FALSE ) ;
return ;
}
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_BEFORE :
/*-----------------------------------------------------------------------------
** ●●● 曲戻し ●●●
-----------------------------------------------------------------------------*/
no = CDDA_NOW_musicno ;
/* ●● 曲戻し SWITCH ON ●● */
CDDA_switch( CDDA_SW_REWMUSIC ) ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
disptime( CDDA_NOW_musicno,Timemode ) ;
KEY_break( key ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case KEY_NEXT :
/*-----------------------------------------------------------------------------
** ●●● 曲送り ●●●
-----------------------------------------------------------------------------*/
no = CDDA_NOW_musicno ;
/* ●● 曲送り SWITCH ON ●● */
CDDA_switch( CDDA_SW_FFMUSIC ) ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
KEY_break( key ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case KEY_F :
/*-----------------------------------------------------------------------------
** ●●● 時間送り ●●●
-----------------------------------------------------------------------------*/
no = CDDA_NOW_musicno ;
/* ●● 時間送り SWITCH ON ●● */
CDDA_switch( CDDA_SW_FFTIME ) ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
keyrepflg = FALSE ;
do {
no = CDDA_NOW_musicno ;
/* ●● 時間送り SWITCH ON ●● */
if ( CDDA_switch( CDDA_SW_FFTIME ) ) break ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
if ( keyrepflg ) {
; /* キーリピート間隔 0 */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case KEY_R :
/*-----------------------------------------------------------------------------
** ●●● 時間戻し ●●●
-----------------------------------------------------------------------------*/
no = CDDA_NOW_musicno ;
/* ●● 時間戻し SWITCH ON ●● */
CDDA_switch( CDDA_SW_REWTIME ) ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
keyrepflg = FALSE ;
do {
no = CDDA_NOW_musicno ;
/* ●● 時間戻し SWITCH ON ●● */
if ( CDDA_switch( CDDA_SW_REWTIME ) ) break ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
disptime( CDDA_NOW_musicno,Timemode ) ;
if ( keyrepflg ) {
; /* キーリピート間隔 0 */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectelevol( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (電子ボリューム処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectelevol>と同じ処理であること.
=============================================================================*/
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_HOME :
/*-----------------------------------------------------------------------------
** ●●● MUTE ON/OFF ●●●
-----------------------------------------------------------------------------*/
if ( Flg.mute ) {
Flg.mute = FALSE ;
} else {
Flg.mute = TRUE ;
}
dispelevol() ;
if ( Flg.mute ) {
ELEVOL_mute() ;
} else {
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
}
break ;
case KEY_U :
/*-----------------------------------------------------------------------------
** ●●● 電子ボリューム UP ●●●
-----------------------------------------------------------------------------*/
keyrepflg = FALSE ;
Flg.mute = FALSE ;
do {
Evol += 4 ;
if ( Evol > ELEVOL_MAX ) Evol = ELEVOL_MAX ;
dispelevol() ;
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
if ( Evol == ELEVOL_MAX ) break ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
break ;
case KEY_D :
/*-----------------------------------------------------------------------------
** ●●● 電子ボリューム DOWN ●●●
-----------------------------------------------------------------------------*/
keyrepflg = FALSE ;
Flg.mute = FALSE ;
do {
Evol -= 4 ;
if ( Evol < ELEVOL_MIN ) Evol = ELEVOL_MIN ;
dispelevol() ;
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
if ( Evol == ELEVOL_MIN ) break ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
break ;
case KEY_UNDO :
/*-----------------------------------------------------------------------------
** ●●● 電子ボリューム MAX ●●●
-----------------------------------------------------------------------------*/
Flg.mute = FALSE ;
Evol = ELEVOL_MAX ;
dispelevol() ;
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectup( void )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (前曲番号選択処理)
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int no ;
int c ;
/*-----------------------------------------------------------------------------
** 表示曲番号(XORno)が 0 でなければ、デクリメント する.
** 0 ならば、演奏中の曲番号を セット する. 演奏中でなければ、最後の曲番号をセット
** する.
-----------------------------------------------------------------------------*/
no = XORno ;
if ( no > ZERO ) no -- ;
if ( !XORno ) {
no = CDDA_NOW_musicno ;
}
if ( !no ) {
no = CDDA_INFO_buf.end ;
}
c = 0 ;
while ( TRUE ) {
if ( !CDDA_data_check( no ) ) {
/* 音楽ならば... */
dispselectmusicno( no ) ;
mossetpos( no ) ;
break ;
}
if ( no > ZERO ) no -- ;
if ( !no ) {
no = CDDA_INFO_buf.end ;
}
c ++ ;
if ( c > CDDA_INFO_buf.end ) break ;
} ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectdown( void )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (後曲番号選択処理)
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int no ;
int c ;
/*-----------------------------------------------------------------------------
** 表示曲番号(XORno)が 0 でなければ、インクリメント する.
** 0 ならば、演奏中の曲番号を セット する. 演奏中でなければ、最初の曲番号をセット
** する.
-----------------------------------------------------------------------------*/
no = XORno ;
if ( no ) no ++ ;
if ( !XORno ) {
no = CDDA_NOW_musicno ;
}
if ( no > CDDA_INFO_buf.end || !no ) {
no = CDDA_INFO_buf.start ;
}
c = 0 ;
while ( TRUE ) {
if ( !CDDA_data_check( no ) ) {
/* 音楽ならば... */
dispselectmusicno( no ) ;
mossetpos( no ) ;
break ;
}
no ++ ;
if ( no > CDDA_INFO_buf.end || !no ) {
no = CDDA_INFO_buf.start ;
}
c ++ ;
if ( c > CDDA_INFO_buf.end ) break ;
} ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectright( void )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (後曲番号選択処理)
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int no ;
int c ;
/*-----------------------------------------------------------------------------
** 表示曲番号(XORno)が 0 でなければ、1行に表示されている曲数分加える.
** 0 ならば、演奏中の曲番号を セット する. 演奏中でなければ、最初の曲番号をセット
** する.
-----------------------------------------------------------------------------*/
no = XORno ;
if ( no ) no += 20 ;
if ( !XORno ) {
no = CDDA_NOW_musicno ;
}
if ( no > CDDA_INFO_buf.end ) {
no %= 20 ;
if ( !no ) no = 20 ;
}
if ( !no ) {
no = CDDA_INFO_buf.start ;
}
c = 0 ;
while ( TRUE ) {
if ( !CDDA_data_check( no ) ) {
/* 音楽ならば... */
dispselectmusicno( no ) ;
mossetpos( no ) ;
break ;
}
no += 20 ;
if ( no > CDDA_INFO_buf.end ) {
no %= 20 ;
if ( !no ) no = 20 ;
}
c ++ ;
if ( c > CDDA_INFO_buf.end / 20 ) break ;
} ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectleft( void )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (後曲番号選択処理)
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int no ;
int c, p ;
/*-----------------------------------------------------------------------------
** 表示曲番号(XORno)が 0 でなければ、1行に表示されている曲数分引く.
** 0 ならば、演奏中の曲番号を セット する. 演奏中でなければ、最初の曲番号をセット
** する.
-----------------------------------------------------------------------------*/
no = XORno ;
if ( no ) no -= 20 ;
if ( !XORno ) {
no = CDDA_NOW_musicno ;
}
if ( no < CDDA_INFO_buf.start ) {
no += 20 ;
p = CDDA_INFO_buf.end / 20 * 20 ;
if ( no + p > CDDA_INFO_buf.end ) {
if ( p ) no += ( p - 20 ) ;
} else {
no += p ;
}
}
if ( !no ) {
no = CDDA_INFO_buf.start ;
}
c = 0 ;
p = CDDA_INFO_buf.end / 20 * 20 ;
while ( TRUE ) {
if ( !CDDA_data_check( no ) ) {
/* 音楽ならば... */
dispselectmusicno( no ) ;
mossetpos( no ) ;
break ;
}
no -= 20 ;
if ( no < CDDA_INFO_buf.start ) {
no += 20 ;
if ( no + p > CDDA_INFO_buf.end ) {
if ( p ) no += ( p - 20 ) ;
} else {
no += p ;
}
}
c ++ ;
if ( c > p / 20 ) break ;
} ;
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectmusic( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (曲番号選択処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_UP :
keyrepflg = FALSE ;
do {
KEY_selectup() ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
break ;
case KEY_DOWN :
keyrepflg = FALSE ;
do {
KEY_selectdown() ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
break ;
case KEY_RIGHT :
keyrepflg = FALSE ;
do {
KEY_selectright() ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
break ;
case KEY_LEFT :
keyrepflg = FALSE ;
do {
KEY_selectleft() ;
if ( keyrepflg ) {
SOFT_timer( KEY_REPEAT ) ; /* キーリピート間隔待ち */
} else {
SOFT_timer( KEY_WAIT ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
} while ( KEY_test( matrix,key ) ) ;
KEY_break( key ) ;
KYB_clrbuf() ;
}
}
/****************************** キーイベントの実行 ******************************/
void KEY_selectprogramsw( char key )
/*=============================================================================
** キーボードから入力キーに対応するイベントを実行する. (プログラム曲確認/削除処理)
**
** < INPUT > : 入力されたキーアドレス
** < OUTPUT > : なし
** < RETURN > : なし
**
** ★[CDPN.C]<event-selectprogramsw>と同じ処理であること.
=============================================================================*/
{
int evno ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) return ;
/*-----------------------------------------------------------------------------
** スイッチ ON 表示
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
switch ( key ) {
case KEY_C :
evno = SW_CHECK + SWVAL ;
break ;
case KEY_Y :
evno = SW_CLEAR + SWVAL ;
}
dispevent( evno,TRUE ) ;
mossetpos( evno ) ;
/*-----------------------------------------------------------------------------
** スイッチ 操作(実行)
-----------------------------------------------------------------------------*/
switch ( key ) {
case KEY_C :
selectprogramsw( SW_CHECK ) ;
break ;
case KEY_Y :
selectprogramsw( SW_CLEAR ) ;
break ;
case KEY_T :
if ( tapeselecton() ) { /* 有効 */
mossetpos( SW_TOTAL ) ;
TAPE_autoselect() ;
}
}
}
/****************************** キーイベントのチェック ******************************/
int KEY_event( void )
/*=============================================================================
** キーボードから入力キーに対応するイベントをチェックする.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 終了の時 真値, それ以外は 偽値.
**
** イベントに対応するスイッチを表示ONにするので、必要に応じて呼び側で表示OFFにする
** 必要があります.
=============================================================================*/
{
char matrix[16] ; /* キーマトリクス取得用 */
char key ;
KYB_clrbuf() ;
KYB_matrix( matrix ) ;
if ( KEY_matrix_check( matrix ) ) { /* キー入力あり */
if ( CDDA_NOW_status == CDDA_STAT_STOP ||
CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
Noaflg = TRUE ;
SNDPLAY_stop( STOP_CH ) ;
Tcount3 = NOA_WAIT + 1 ;
}
}
key = FALSE ;
if ( KEY_test( matrix,KEY_CTRL ) ) { /* CTRL キー ON */
if ( KEY_test( matrix,KEY_Q ) ) { /* End */
key = KEY_Q ;
KEY_selectexit( key ) ;
return( TRUE ) ;
} else if ( KEY_test( matrix,KEY_E ) ) { /* End */
key = KEY_E ;
KEY_selectexit( key ) ;
return( TRUE ) ;
} else if ( KEY_test( matrix,KEY_S ) ) { /* Suffle */
key = KEY_S ;
KEY_selectplay( key ) ;
} else if ( KEY_test( matrix,KEY_R ) ) { /* Repeat */
key = KEY_R ;
KEY_selectmode( key ) ;
} else if ( KEY_test( matrix,KEY_C ) ) { /* Check */
key = KEY_C ;
KEY_selectprogramsw( key ) ;
} else if ( KEY_test( matrix,KEY_Y ) ) { /* Clear */
key = KEY_Y ;
KEY_selectprogramsw( key ) ;
} else if ( KEY_test( matrix,KEY_T ) ) { /* Tape select */
key = KEY_T ;
KEY_selectprogramsw( key ) ;
}
} else { /* CTRL キー OFF */
if ( KEY_test( matrix,KEY_CR ) ) { /* PLAY */
key = KEY_CR ;
KEY_selectplay( key ) ;
} else if ( KEY_test( matrix,KEY_EXEC ) ) { /* PLAY */
key = KEY_EXEC ;
KEY_selectplay( key ) ;
} else if ( KEY_test( matrix,TKEY_CR ) ) { /* PLAY */
key = TKEY_CR ;
KEY_selectplay( key ) ;
} else if ( KEY_test( matrix,KEY_BEFORE ) ) { /* 前曲 */
key = KEY_BEFORE ;
KEY_selectffrew( key ) ;
} else if ( KEY_test( matrix,KEY_NEXT ) ) { /* 次曲 */
key = KEY_NEXT ;
KEY_selectffrew( key ) ;
} else if ( KEY_test( matrix,KEY_F ) ) { /* FF */
key = KEY_F ;
KEY_selectffrew( key ) ;
} else if ( KEY_test( matrix,KEY_R ) ) { /* REW */
key = KEY_R ;
KEY_selectffrew( key ) ;
} else if ( KEY_test( matrix,KEY_SPACE ) ) { /* PAUSE */
key = KEY_SPACE ;
KEY_selectstop( key ) ;
} else if ( KEY_test( matrix,TKEY_EQU ) ) { /* PAUSE */
key = TKEY_EQU ;
KEY_selectstop( key ) ;
} else if ( KEY_test( matrix,KEY_T ) ) { /* Time */
key = KEY_T ;
KEY_selectmode( key ) ;
} else if ( KEY_test( matrix,KEY_P ) ) { /* Program */
key = KEY_P ;
KEY_selectmode( key ) ;
} else if ( KEY_test( matrix,KEY_S ) ) { /* Single */
key = KEY_S ;
KEY_selectmode( key ) ;
} else if ( KEY_test( matrix,KEY_C ) ) { /* Continue */
key = KEY_C ;
KEY_selectmode( key ) ;
} else if ( KEY_test( matrix,KEY_HOME ) ) { /* MUTE ON/OFF */
key = KEY_HOME ;
KEY_selectelevol( key ) ;
} else if ( KEY_test( matrix,KEY_U ) ) { /* Vol. UP */
key = KEY_U ;
KEY_selectelevol( key ) ;
} else if ( KEY_test( matrix,KEY_D ) ) { /* Vol. DOWN */
key = KEY_D ;
KEY_selectelevol( key ) ;
} else if ( KEY_test( matrix,KEY_UNDO ) ) { /* Vol. MAX */
key = KEY_UNDO ;
KEY_selectelevol( key ) ;
} else if ( KEY_test( matrix,KEY_UP ) ) { /* CUR up */
key = KEY_UP ;
KEY_selectmusic( key ) ;
} else if ( KEY_test( matrix,KEY_DOWN ) ) { /* CUR down */
key = KEY_DOWN ;
KEY_selectmusic( key ) ;
} else if ( KEY_test( matrix,KEY_RIGHT ) ) { /* CUR right */
key = KEY_RIGHT ;
KEY_selectmusic( key ) ;
} else if ( KEY_test( matrix,KEY_LEFT ) ) { /* CUR left */
key = KEY_LEFT ;
KEY_selectmusic( key ) ;
} else if ( KEY_test( matrix,KEY_ESC ) ) { /* STOP */
key = KEY_ESC ;
KEY_selectstop( key ) ;
} else if ( KEY_test( matrix,KEY_BREAK ) ) { /* EXIT */
key = KEY_BREAK ;
KEY_selectexit( key ) ;
return( TRUE ) ;
}
}
KEY_break( key ) ;
dispmouse( TRUE ) ;
return( FALSE ) ;
}